home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / iflib / ftn.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-03  |  7.9 KB  |  416 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include "lutil.h"
  6. #include "xutil.h"
  7. #include "ftn.h"
  8. #include "config.h"
  9.  
  10. void tidy_faddr(addr)
  11. faddr *addr;
  12. {
  13.     if (addr == NULL) return;
  14.     if (addr->name) free(addr->name);
  15.     if (addr->domain) free(addr->domain);
  16.     free(addr);
  17. }
  18.  
  19. void tidy_falist(fap)
  20. fa_list **fap;
  21. {
  22.     fa_list *tmp,*old;
  23.  
  24.     debug(8,"tidy_falist beginning from %s",
  25.         *fap?ascinode((*fap)->addr,0x06):"<null>");
  26.     for (tmp=*fap;tmp;tmp=old)
  27.     {
  28.         old=tmp->next;
  29.         tidy_faddr(tmp->addr);
  30.         free(tmp);
  31.     }
  32.     *fap=NULL;
  33. }
  34.  
  35. faddr *parsefaddr(s)
  36. char *s;
  37. {
  38.     faddr addr,*tmp;
  39.     dom_trans *dt;
  40.     char *buf,*str,*p,*q;
  41.     int gotnet=0,gotnode=0;
  42.  
  43.     if (s == NULL) return NULL;
  44.  
  45.     str=buf=xstrcpy(s);
  46.  
  47.     p=str+strlen(str)-1;
  48.     while ((p >= str) && ((*p == '\n') || (*p == '\n') || (isspace(*p))))
  49.         *(p--)='\0';
  50.     if (((*str == '(') && (*p == ')')) ||
  51.         ((*str == '\"') && (*p == '\"')) ||
  52.         ((*str == '\'') && (*p == '\'')))
  53.     {
  54.         str++;
  55.         *p='\0';
  56.     }
  57.  
  58.     if (((p=strrchr(str,'<'))) && ((q=strchr(str,'>'))) && (p < q))
  59.     {
  60.         str=p+1;
  61.         *q='\0';
  62.     }
  63.     else if (((p=strrchr(str,'('))) && ((q=strchr(str,')'))) && (p < q))
  64.     {
  65.         *p='\0';
  66.     }
  67.  
  68.     while (isspace(*str)) str++;
  69.     for (p=str+strlen(str)-1;(p >= str) && *p && isspace(*p);p--)
  70.         *p='\0';
  71.  
  72.     addr.name=NULL;
  73.  
  74.     if ((p=strrchr(str,'@'))) *(p++)='\0';
  75.     else if ((p=strchr(str,'!')))
  76.     {
  77.         *p++='\0';
  78.         q=p + strlen(p) - 1;
  79.         if ((*p == '\"') && (*q == '\"'))
  80.         {
  81.             p++;
  82.             *q='\0';
  83.         }
  84.         if (strlen(p) > MAXNAME) p[MAXNAME]='\0';
  85.         addr.name=xstrcpy(p);
  86.         p=str;
  87.     }
  88.     else if ((p=strrchr(str,'%'))) *(p++)='\0';
  89.     else p=str;
  90.  
  91.     if ((p != str) && (!addr.name))
  92.     {
  93.         q=str + strlen(str) - 1;
  94.         if ((*str == '\"') && (*q == '\"'))
  95.         {
  96.             str++;
  97.             *q='\0';
  98.         }
  99.         else if ((!strchr(str,'@')) && (!strchr(str,'%')) &&
  100.              (!strchr(str,'!')))
  101.         {
  102.             for (q=str;*q;q++) if (*q == '.') *q = ' ';
  103.         }
  104.         if ((!strchr(str,'@')) && ((q=strrchr(str,'%')))) *q='@';
  105.         while (*str == ' ') str++;
  106.         if (strlen(str) > MAXNAME) str[MAXNAME]='\0';
  107.         addr.name=xstrcpy(str);
  108.     }
  109.  
  110.     addr.point=0;
  111.     addr.node=0;
  112.     addr.net=0;
  113.     addr.zone=0;
  114.     addr.domain=NULL;
  115.  
  116.     for (dt=domtrans;dt;dt=dt->next)
  117.     {
  118.         q=p+strlen(p)-strlen(dt->intdom);
  119.         if ((q >= p) && (strcasecmp(dt->intdom,q) == 0))
  120.         {
  121.             *q='\0';
  122.             q=xmalloc(strlen(p)+strlen(dt->ftndom)+1);
  123.             strcpy(q,p);
  124.             strcat(q,dt->ftndom);
  125.             p=q;
  126.             free(buf);
  127.             buf=p;
  128.             break;
  129.         }
  130.     }
  131.  
  132.     for (p=strtok(p,".");p;p=strtok(NULL,"."))
  133.     {
  134.         if (strspn(p+1,"0123456789") == strlen(p+1))
  135.         switch (*p)
  136.         {
  137.         case 'P':
  138.         case 'p':    addr.point=atoi(p+1); break;
  139.         case 'F':
  140.         case 'f':    addr.node=atoi(p+1); gotnode++; break;
  141.         case 'N':
  142.         case 'n':    addr.net=atoi(p+1); gotnet++; break;
  143.         case 'Z':
  144.         case 'z':    addr.zone=atoi(p+1); break;
  145.         default:    if (!addr.domain)
  146.                     addr.domain=xstrcpy(p);
  147.                 break;
  148.         }
  149.         else if (!addr.domain) addr.domain=xstrcpy(p);
  150.     }
  151.  
  152.     free(buf);
  153.  
  154.     if (addr.domain && (strcasecmp(addr.domain,"ftn") == 0))
  155.     {
  156.         free(addr.domain);
  157.         addr.domain=NULL;
  158.     }
  159.  
  160.     if ((gotnet == 1) && (gotnode == 1))
  161.     {
  162.         tmp=(faddr *)xmalloc(sizeof(addr));
  163.         tmp->name=addr.name;
  164.         tmp->domain=addr.domain;
  165.         tmp->point=addr.point;
  166.         tmp->node=addr.node;
  167.         tmp->net=addr.net;
  168.         tmp->zone=addr.zone;
  169.         return tmp;
  170.     }
  171.     else
  172.     {
  173.         if (addr.name) free(addr.name);
  174.         if (addr.domain) free(addr.domain);
  175.         return NULL;
  176.     }
  177. }
  178.  
  179. faddr *parsefnode(s)
  180. char *s;
  181. {
  182.     faddr addr,*tmp;
  183.     char *buf,*str,*p,*q,*n;
  184.     int good = 1;
  185.  
  186.     if (s == NULL) return NULL;
  187.  
  188.     str=buf=xstrcpy(s);
  189.  
  190.     while (*str == ' ') str++;
  191.     if (*(p=str+strlen(str)-1) == '\n') *(p--)='\0';
  192.     while (*p == ' ') *(p--) = '\0';
  193.  
  194.     p=str + strlen(str) - 1;
  195.     if (((*str == '(') && (*p == ')')) ||
  196.         ((*str == '\"') && (*p == '\"')) ||
  197.         ((*str == '\'') && (*p == '\'')) ||
  198.         ((*str == '<') && (*p == '>')) ||
  199.         ((*str == '[') && (*p == ']')) ||
  200.         ((*str == '{') && (*p == '}')))
  201.     {
  202.         str++;
  203.         *p='\0';
  204.     }
  205.  
  206.     addr.name=NULL;
  207.     if ((p=strrchr(str,' ')))
  208.     {
  209.         n=str;
  210.         str=p+1;
  211.         while (*p == ' ') *(p--) = '\0';
  212.         if (!strcasecmp(p-2," of")) *(p-2) = '\0';
  213.         p-=3;
  214.         while ((*p == ' ') || (*p == ',')) *(p--) = '\0';
  215.         if (strlen(n) > MAXNAME) n[MAXNAME]='\0';
  216.         if (*n != '\0') addr.name=xstrcpy(n);
  217.     }
  218.  
  219.     if ((p=strrchr(str,'@'))) *(p++)='\0';
  220.     else if ((p=strrchr(str,'%'))) *(p++)='\0';
  221.     else p=NULL;
  222.     if (p && ((q=strchr(p,'.')))) *q='\0';
  223.  
  224.     addr.point=0;
  225.     addr.node=0;
  226.     addr.net=0;
  227.     addr.zone=0;
  228.     addr.domain=xstrcpy(p);
  229.  
  230.     if ((p=strchr(str,':')))
  231.     {
  232.         *(p++)='\0';
  233.         if (strspn(str,"0123456789") == strlen(str))
  234.             addr.zone=atoi(str);
  235.         else if (strcmp(str,"*") == 0)
  236.             addr.zone=-1;
  237.         else good=0;
  238.         str=p;
  239.     }
  240.     if ((p=strchr(str,'/')))
  241.     {
  242.         *(p++)='\0';
  243.         if (strspn(str,"0123456789") == strlen(str))
  244.             addr.net=atoi(str);
  245.         else if (strcmp(str,"*") == 0)
  246.             addr.net=-1;
  247.         else good=0;
  248.         str=p;
  249.     }
  250.     if ((p=strchr(str,'.')))
  251.     {
  252.         *(p++)='\0';
  253.         if (strspn(str,"0123456789") == strlen(str))
  254.             addr.node=atoi(str);
  255.         else if (strcmp(str,"*") == 0)
  256.             addr.node=-1;
  257.         else good=0;
  258.         str=p;
  259.     }
  260.     else
  261.     {
  262.         if (strspn(str,"0123456789") == strlen(str))
  263.             addr.node=atoi(str);
  264.         else if (strcmp(str,"*") == 0)
  265.             addr.node=-1;
  266.         else good=0;
  267.         str=NULL;
  268.     }
  269.     if (str)
  270.     {
  271.         if (strspn(str,"0123456789") == strlen(str))
  272.             addr.point=atoi(str);
  273.         else if (strcmp(str,"*") == 0)
  274.             addr.point=-1;
  275.         else good=0;
  276.     }
  277.  
  278.     if (buf) free(buf);
  279.  
  280.     if (good)
  281.     {
  282.         tmp=(faddr *)xmalloc(sizeof(addr));
  283.         tmp->name=NULL;
  284.         tmp->domain=addr.domain;
  285.         tmp->point=addr.point;
  286.         tmp->node=addr.node;
  287.         tmp->net=addr.net;
  288.         tmp->zone=addr.zone;
  289.         return tmp;
  290.     }
  291.     else
  292.     {
  293.         if (addr.name) free(addr.name);
  294.         if (addr.domain) free(addr.domain);
  295.         return NULL;
  296.     }
  297. }
  298.  
  299. char *ascinode(a,fl)
  300. faddr *a;
  301. int fl;
  302. {
  303.     static char buf[128],*f,*t,*q;
  304.     dom_trans *dt;
  305.     fa_list *tmpl;
  306.     int skip;
  307.  
  308.     if (a == NULL)
  309.     {
  310.         strcpy(buf,"<none>");
  311.         return buf;
  312.     }
  313.  
  314.     buf[0]='\0';
  315.     if ((fl & 0x80) && (a->name))
  316.     {
  317.         if ((strchr(a->name,'.')) || (strchr(a->name,'@')) ||
  318.             (strchr(a->name,'\'')))
  319.             sprintf(buf+strlen(buf),"\"%s\" <",a->name);
  320.         else
  321.             sprintf(buf+strlen(buf),"%s <",a->name);
  322.     }
  323.     if ((fl & 0x40) && (a->name))
  324.     {
  325.         f=a->name;
  326.         t=buf+strlen(buf);
  327.         skip=0;
  328.         while (*f)
  329.         {
  330.             switch (*f)
  331.             {
  332.             case '.':
  333.             case ' ':    if (!skip) *t++='.'; skip=1; break;
  334.             case '@':    skip=0; *t++='%'; break;
  335.             case '"':    skip=0; *t++='\\'; *t++='"'; break;
  336.             case '\'':    skip=0; *t++='\\'; *t++='\''; break;
  337.             default:    skip=0; *t++=*f; break;
  338.             }
  339.             f++;
  340.         }
  341.         *t++='@';
  342.         *t++='\0';
  343.     }
  344.     if ((fl & 0x01) && (a->point))
  345.         sprintf(buf+strlen(buf),"p%u.",a->point);
  346.     if (fl & 0x02)
  347.         sprintf(buf+strlen(buf),"f%u.",a->node);
  348.     if (fl & 0x04)
  349.         sprintf(buf+strlen(buf),"n%u.",a->net);
  350.     if ((fl & 0x08) && (a->zone))
  351.         sprintf(buf+strlen(buf),"z%u.",a->zone);
  352.     buf[strlen(buf)-1]='\0';
  353.     if ((fl & 0x10) && (a->domain))
  354.         sprintf(buf+strlen(buf),".%s",a->domain);
  355.     if (fl & 0x20)
  356.     {
  357.         if (a->domain)
  358.         {
  359.             if ((fl & 0x10) == 0)
  360.                 sprintf(buf+strlen(buf),".%s",a->domain);
  361.         }
  362.         else
  363.         {
  364.             for (tmpl=nllist;tmpl;tmpl=tmpl->next)
  365.                 if (tmpl->addr->zone == a->zone) break;
  366.             if (tmpl && tmpl->addr->domain)
  367.                 sprintf(buf+strlen(buf),".%s",
  368.                     tmpl->addr->domain);
  369.             else
  370.                 sprintf(buf+strlen(buf),".fidonet");
  371.         }
  372.         for (dt=domtrans;dt;dt=dt->next)
  373.         {
  374.             q=buf+strlen(buf)-strlen(dt->ftndom);
  375.             if ((q >= buf) && (strcasecmp(dt->ftndom,q) == 0))
  376.             {
  377.                 strcpy(q,dt->intdom);
  378.                 break;
  379.             }
  380.         }
  381.         if (dt == NULL) sprintf(buf+strlen(buf),".ftn");
  382.     }
  383.     /* else sprintf(buf+strlen(buf),".ftn"); */
  384.     if ((fl & 0x80) && (a->name))
  385.         sprintf(buf+strlen(buf),">");
  386.     return buf;
  387. }
  388.  
  389. char *ascfnode(a,fl)
  390. faddr *a;
  391. int fl;
  392. {
  393.     static char buf[128];
  394.  
  395.     if (a == NULL)
  396.     {
  397.         strcpy(buf,"<none>");
  398.         return buf;
  399.     }
  400.  
  401.     buf[0]='\0';
  402.     if ((fl & 0x40) && (a->name))
  403.         sprintf(buf+strlen(buf),"%s of ",a->name);
  404.     if ((fl & 0x08) && (a->zone))
  405.         sprintf(buf+strlen(buf),"%u:",a->zone);
  406.     if (fl & 0x04)
  407.         sprintf(buf+strlen(buf),"%u/",a->net);
  408.     if (fl & 0x02)
  409.         sprintf(buf+strlen(buf),"%u",a->node);
  410.     if ((fl & 0x01) && (a->point))
  411.         sprintf(buf+strlen(buf),".%u",a->point);
  412.     if ((fl & 0x10) && (a->domain))
  413.         sprintf(buf+strlen(buf),"@%s",a->domain);
  414.     return buf;
  415. }
  416.